package spring.AOP.xml;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

import java.util.Arrays;

/**
 * <p>类描述：AOP。</p>
 *
 * @author 贾亮
 * @version v1.0.0.1。
 * @since JDK1.8。
 * <p>创建日期：2018/3/8 9:11。</p>
 */

public class LoggingAspect {


    /**
     * 在方法开始之前执行代码
     *
     * @param joinPoint
     */
    public void before(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        System.out.println("The method " + methodName + " begins with " + Arrays.asList(joinPoint.getArgs()));
    }

    /**
     * 在方法执行之后执行的代码，无论该方法是否出现异常。
     *
     * @param joinPoint
     */
    public void after(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        System.out.println("The method " + methodName + " end");
    }

    /**
     * 方法正常结束时执行的代码，可访问返回值
     *
     * @param joinPoint
     * @param result
     */
    public void afterReturn(JoinPoint joinPoint, Object result) {
        String methodName = joinPoint.getSignature().getName();
        System.out.println("The method " + methodName + " result is " + result);
    }

    /**
     * 方法出现异常时执行的代码
     * 且可以指定在出现特定异常时再执行通知代码
     *
     * @param joinPoint
     * @param e         可以是具体的异常
     */
    public void exception(JoinPoint joinPoint, Exception e) {
        String methodName = joinPoint.getSignature().getName();
        System.out.println("The method " + methodName + " occurs exception:" + e);
    }

//    /**
//     * 环绕通知需要携带 ProceedingJoinPoint 类型的参数
//     * 且环绕通知必须有返回值，返回值即为目标方法的返回值
//     * @param proceedingJoinPoint
//     * @return
//     */
//    public Object aroundMethod(ProceedingJoinPoint proceedingJoinPoint) {
//        Object result = null;
//        String methodName = proceedingJoinPoint.getSignature().getName();
//        try {
//            // 前置通知
//            System.out.println("The method " + methodName + " begins with " + Arrays.asList(proceedingJoinPoint.getArgs()));
//            // 执行方法
//            result = proceedingJoinPoint.proceed();
//            // 返回通知
//            System.out.println("The method " + methodName + " ends with " + result);
//        } catch (Throwable e) {
//            //异常通知
//            System.out.println("The method " + methodName + " occurs exception:" + e);
//        }
//        // 后置通知
//        System.out.println("The method " + methodName + " ends");
//        return result;
//    }

}
